package es.ugr.beequizz.dao.impl;

import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.springframework.jdbc.core.RowMapper;
import org.springframework.stereotype.Repository;

import es.ugr.beequizz.bean.InformacionUsuarioBean;
import es.ugr.beequizz.bean.UsuarioBean;
import es.ugr.beequizz.dao.GenericDAO;
import es.ugr.beequizz.dao.UsuarioDAO;

@Repository
public class UsuarioDAOImpl extends GenericDAO implements UsuarioDAO {

	//Requete SQL para guardar los datos del usuario
	private static final String NUEVO_USUARIO_SQL = "INSERT INTO usuario (nombre, " +
			"apellidos, apodo, mail, password) " +
			"VALUES ( :nombre, :apellidos, :apodo, :mail, :password) RETURNING id";

	private static final String RECUPERAR_ID_USUARIO_SQL = "SELECT id FROM usuario WHERE apodo = :username";

	private static final String RECUPERAR_PASSWORD_SQL = "SELECT apodo, mail, password FROM usuario WHERE apodo = :username";

	private static final String VALIDAR_USUARIO_SQl = "SELECT EXISTS (SELECT * FROM usuario WHERE apodo = :username) AS existe";

	private static final String RECUPERAR_INFORMACION_SQL = "SELECT apodo, mail, password, id FROM usuario WHERE id = :idJugador";

	private static final String RECUPERAR_USUARIOS_SQL = "SELECT * FROM usuario where id <> :idUsuario";

	private static final String RECUPERAR_USUARIO_SQL = "SELECT nombre , apellidos ,apodo, mail, password, id FROM usuario WHERE apodo = :apodo";
;

	private static final String MODIFICAR_USUARIO_SQL = "UPDATE usuario SET nombre = :nombre , apellidos = :apellidos , apodo = :apodo , mail = :mail , password = :password WHERE id = :id";	


	private class UsuarioInformacionRowMaper implements RowMapper<InformacionUsuarioBean>{

		public InformacionUsuarioBean mapRow(ResultSet result, int arg1) throws SQLException{
			InformacionUsuarioBean bean = new InformacionUsuarioBean();
			bean.setId(result.getLong("id"));
			bean.setApodo(result.getString("apodo"));
			bean.setMail(result.getString("mail"));
			bean.setPassword(result.getString("password"));

			return bean;

		}
	}
	
	private class UsuarioBeanRowMaper implements RowMapper<UsuarioBean>{

		public UsuarioBean mapRow(ResultSet result, int arg1) throws SQLException{
			UsuarioBean bean = new UsuarioBean();
			bean.setId(result.getLong("id"));
			bean.setApodo(result.getString("apodo"));
			bean.setMail(result.getString("mail"));
			bean.setPassword(result.getString("password"));
			bean.setApellidos(result.getString("apellidos"));
			bean.setNombre(result.getString("nombre"));
			
			return bean;

		}
	}





	public Long nuevoUsuario(UsuarioBean bean) {

		//Inicializamos los parametros que vamos a guardar
		Map<String,Object>  params = new HashMap<String, Object>();
		params.put("nombre", bean.getNombre());
		params.put("apellidos", bean.getApellidos());
		params.put("apodo", bean.getApodo());
		params.put("mail", bean.getMail());
		params.put("password", bean.getPassword());

		return this.namedTemplate.queryForLong(NUEVO_USUARIO_SQL, params);

	}

	public Long recuperarIdUsuario(String username) {

		Map<String,Object>  params = new HashMap<String, Object>();
		params.put("username", username);

		return namedTemplate.queryForObject(RECUPERAR_ID_USUARIO_SQL, params, Long.class);
	}


	public InformacionUsuarioBean recuperarInformacionUsuario(String username) {

		Map<String, Object> params = new HashMap<String, Object>();
		params.put("username", username);

		return namedTemplate.queryForObject(RECUPERAR_PASSWORD_SQL, params,new UsuarioInformacionRowMaper());
	}

	public Boolean validarUsuario(String username) {

		Map<String, Object> params = new HashMap<String, Object>();
		params.put("username", username);

		return namedTemplate.queryForObject(VALIDAR_USUARIO_SQl, params, Boolean.class);
	}

	public InformacionUsuarioBean informacionUsuario(Long idJugador) {

		Map<String, Object> params = new HashMap<String, Object>();
		params.put("idJugador", idJugador);

		return namedTemplate.queryForObject(RECUPERAR_INFORMACION_SQL, params, new UsuarioInformacionRowMaper());
	}

	public List<InformacionUsuarioBean> recuperarUsuarios(Long idUsuario) {
		Map<String, Object> params = new HashMap<String, Object>();
		params.put("idUsuario", idUsuario);

		return namedTemplate.query(RECUPERAR_USUARIOS_SQL, params, new UsuarioInformacionRowMaper());
	}

	public void modificarUsuario(UsuarioBean bean) {
		//Inicializamos los parametros que vamos a guardar
		Map<String,Object>  params = new HashMap<String, Object>();
		params.put("id", bean.getId());
		params.put("nombre", bean.getNombre());
		params.put("apellidos", bean.getApellidos());
		params.put("apodo", bean.getApodo());
		params.put("mail", bean.getMail());
		params.put("password", bean.getPassword());

		this.namedTemplate.update(MODIFICAR_USUARIO_SQL, params);
	}

	public UsuarioBean recuperarUsuario(String apodo) {
		Map<String, Object> params = new HashMap<String, Object>();
		params.put("apodo", apodo);

		return namedTemplate.queryForObject(RECUPERAR_USUARIO_SQL, params, new UsuarioBeanRowMaper());
	}



}
